package juc.day02;

import java.util.Random;
import java.util.concurrent.*;

/*
线程池:提供了一个线程队列，队列中保存着所有等待状态的线程。避免了创建与销毁的额外开销
        提供了响应速度
线程池的体系结构：
        java.util.concurrent.Executor:负责线程使用于调用的根接口
        |--**ExecutorService子接口：线程池的主要接口
            |--ThreadPoolExecutor线程池的实现类
            |--ScheduledExecutorService子接口：负责线程的调度
                |--ScheduledThreadPoolExecutor：继承了ThreadPoolExecutor，实现了ScheduledExecutorService
工具类：Executors
    ExecutorService newFixedThreadPool()：创建固定大小的连接池
    ExecutorService newCacheThreadPool()：缓存线程池，线程池的数量不固定，可以根据需求自动的更改数量
    ExecutorService new SingleThreadExecutor()：创建单个线程池。线程池中只有一个线程

    ScheduledExecutorService newScheduledThreadPool()：创建固定大小的线程池，可以延迟或定时执行任务

    注意：
        Executor接口需要调用shutdown()或shutdownAll()方法，不然线程不会停止
        原因是系统认为你还要分配线程任务
 */
public class TestScheudledThreadPool {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ScheduledExecutorService schedule = Executors.newScheduledThreadPool(5);
        for (int i = 0; i < 5; i++) {
            Future<Integer> result = schedule.schedule(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    int num = new Random().nextInt(100);//生成随机数
                    System.out.println(Thread.currentThread().getName() + " : " + num);
                    return num;
                }
            }, 3, TimeUnit.SECONDS);
        }
        schedule.shutdown();

    }
}
